package com.xiyu.service.service.nurse;

import com.xiyu.service.vo.nurse.nurseItem.NurseItemListQueryOutput;
import com.xiyu.service.repository.nurse.item.NurseItemRepository;
import com.xiyu.service.vo.nurse.nurseItem.NurseItemGetOutput;
import com.xiyu.service.vo.nurse.nurseItem.NurseItemUpdateInput;
import com.xiyu.service.vo.nurse.nurseItem.NurseItemQueryInput;
import com.xiyu.service.vo.nurse.nurseItem.NurseItemQueryOutput;
import com.xiyu.service.vo.nurse.nurseItem.NurseItemCreateInput;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.babyfish.jimmer.Page;
import java.util.*;

import org.springframework.transaction.annotation.Transactional;
import com.xiyu.service.framework.web.web.core.pojo.PageResult;
import com.xiyu.service.convert.nurse.NurseItemConvert;
import com.xiyu.service.model.nurse.item.NurseItem;

import static com.xiyu.service.framework.exception.util.ServiceExceptionUtil.exception;
import static com.xiyu.service.errorCode.nurse.NurseItemErrorCode.*;

/**
 * 护理项目 Service 实现类
 */
@Service
@Validated
public class NurseItemServiceImpl implements NurseItemService {

    @Resource
    private NurseItemRepository nurseItemRepository;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long create(NurseItemCreateInput inputVO) {
        Optional<NurseItem> opOldItem = nurseItemRepository.findFirstByItemName(inputVO.getItemName());
        if(opOldItem.isPresent())
            throw exception(NURSE_ITEM_EXISTS);
        NurseItem newItem = NurseItemConvert.INSTANCE.createInputConvert(inputVO);
        newItem =  nurseItemRepository.insert(newItem);
        return newItem.id();
    }

    @Override
    public PageResult<NurseItemQueryOutput> query(NurseItemQueryInput inputVO) {
        Page<NurseItem> pageItem = nurseItemRepository.pageQuery(inputVO);
        List<NurseItemQueryOutput> listItem = NurseItemConvert.INSTANCE.queryPageOutputConvert(pageItem.getRows());
        return new PageResult<>(listItem, pageItem.getTotalRowCount());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean update(NurseItemUpdateInput inputVO) {
        Optional<NurseItem> opOldItem = nurseItemRepository.findFirstByItemNameAndIdNot(inputVO.getItemName(), inputVO.getId());
        if(opOldItem.isPresent())
            throw exception(NURSE_ITEM_EXISTS);
        NurseItem updateItem = NurseItemConvert.INSTANCE.updateInputConvert(inputVO);
        nurseItemRepository.update(updateItem);
        return true;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean deleted(Long id) {
        Optional<NurseItem> opDeleteItem = nurseItemRepository.findById(id);
        if(!opDeleteItem.isPresent())
            throw exception(NURSE_ITEM_NOT_EXISTS);
        nurseItemRepository.deleteById(id);
        return true;
    }

    @Override
    public NurseItemGetOutput get(Long id) {
        Optional<NurseItem> opItem = nurseItemRepository.findById(id);
        if(!opItem.isPresent())
            throw exception(NURSE_ITEM_NOT_EXISTS);
        return NurseItemConvert.INSTANCE.getOutputConvert(opItem.get());
    }

    @Override
    public List<NurseItemListQueryOutput> listQuery(){
        return NurseItemConvert.INSTANCE.listQueryListOutputConvert(nurseItemRepository.findAll());
    };

}
